package com.sharer.last.service;

import com.github.yulichang.base.MPJBaseService;
import com.sharer.last.base.model.PageVO;
import com.sharer.last.model.dto.blog.*;
import com.sharer.last.model.po.BlogPO;
import com.sharer.last.model.vo.blog.*;
import com.sharer.last.model.vo.category.CategoryAndTagVO;

import java.util.List;
import java.util.Map;

public interface BlogService extends MPJBaseService<BlogPO> {

    /**
     * 统计非保密博客总数
     *
     * @return
     */
    long countBlogByIsPrivacy(String adminToken);

    /**
     * 校验博客
     *
     * @param relevantId
     */
    void checkBlog(Long relevantId, String token);

    /**
     * 校验受保护文章密码并返回密码生成的token
     *
     * @param dto
     * @return
     */
    BlogJwtVO checkBlogPassword(BlogPasswordDTO dto);

    /**
     * 校验密码正确性
     *
     * @param dto
     * @return
     */
    Boolean validateBlogPasswordCorrect(BlogValidateDTO dto);

    /**
     * 获取指定分类下的博客数量
     *
     * @param categoryId
     * @return
     */
    long getBlogNumByCategoryId(Long categoryId);

    /**
     * 获取博客关联数据
     * 分类 标签
     *
     * @return
     */
    CategoryAndTagVO findBlogRelatedData();

    /**
     * 根据id查询数据
     *
     * @param id
     * @param throwException true：为空时抛异常
     * @return
     */
    BlogVO findById(Long id, Boolean throwException);

    /**
     * 根据id查询数据
     *
     * @param id 博客id
     * @return
     */
    NewBlogVO findById(Long id);

    /**
     * 根据token获取博客数据
     *
     * @param id
     * @param token 博客密码生成的token
     * @return
     */
    BlogVO findBlogByToken(Long id, String token);

    /**
     * 条件查询
     *
     * @param queryDTO
     * @return
     */
    List<BlogPO> queryList(BlogQueryDTO queryDTO);

    /**
     * 条件查询
     *
     * @param queryDTO
     * @return
     */
    List<BlogVO> selectList(BlogQueryDTO queryDTO);

    /**
     * 分页查询
     *
     * @param queryDTO
     * @return
     */
    PageVO<BlogVO> selectListByPage(BlogQueryDTO queryDTO);

    /**
     * 获取最新推荐博客 5条 已公开 已推荐
     *
     * @return
     */
    List<NewBlogVO> selectNewestRecommendBlogList(String adminToken);

    /**
     * 获取随机博客 5条 已公开
     *
     * @return
     */
    List<RandomBlogVO> selectRandomBlogList(String adminToken);

    /**
     * 获取所有博客 只需要id和博客标题
     *
     * @return
     */
    List<BlogIdAndTitleVO> selectSimpleList();

    /**
     * 获取所有博客 只需要id和博客标题
     *
     * @param blogIdList 博客文章id集合
     * @return
     */
    Map<Long, BlogIdAndTitleVO> selectBlogTitleAndIdList(List<Long> blogIdList);

    /**
     * 根据年月分组查询博客数据
     *
     * @return
     */
    List<ArchiveBlogVO> selectBlogListGroupByYearMonth(String adminToken);

    /**
     * 关键词搜索博客
     *
     * @param queryDTO
     * @return
     */
    List<SearchBlogVO> selectBlogListBySearch(BlogQueryDTO queryDTO);

    /**
     * 保存草稿或发布新文章
     *
     * @param dto
     * @return
     */
    void createBlog(BlogChangeDTO dto);

    /**
     * 更新博客
     *
     * @param dto
     */
    void updateBlog(BlogChangeDTO dto);

    /**
     * 更新博客置顶状态
     *
     * @param blogId 博客id
     * @param top
     */
    void updateBlogTopById(Long blogId, Integer top);

    /**
     * 更新博客推荐状态
     *
     * @param blogId
     * @param recommend
     */
    void updateBlogRecommendById(Long blogId, Integer recommend);

    /**
     * 更新博客可见性状态
     *
     * @param dto
     */
    void updateBlogVisibilityById(BlogVisibilityDTO dto);

    /**
     * 根据id删除博客
     *
     * @param blogId 博客
     * @return
     */
    void removeBlogById(Long blogId);
}
